package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * 使用反射机制调用方法
 */
public class ReflectDemo4 {
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.doSome();

        //1.通过 Class 对象创建该类的一个实例。
        //总结：反射调用四步曲
        //步骤	   方法	                    功能	                                 等效直接代码
        //1	      Class.forName()	    获取类元信息	                      import reflect.Person;
        //2	       newInstance()	    创建对象实例	                     Person obj = new Person();
        //3	      getMethod()	      定位方法	                          Method m = ...
        //4	      invoke()	           执行方法	                          obj.doSome();



        //  步骤	                        代码	                              含义
        //1. 加载类	         Class cls = Class.forName("reflect.Person");	  获取类的 Class 对象
        //2. 创建对象	     Object obj = cls.newInstance();	              通过反射创建类的实例
        //3. 获取方法	   Method method = cls.getMethod("doSome");          	获取方法对象
        //4. 调用方法	    method.invoke(obj);	                            在对象上调用方法

        //实例化
        Class cls = Class.forName("reflect.Person");
        Object obj = cls.newInstance(); //Object obj = new Person();
        //获取方法对象
        Method method = cls.getMethod("doSome");
        //利用方法对象调用对应的方法
        method.invoke(obj);//obj.doSome()
        // obj.doSome(),自己这样写就不对，因为点不出来dosome,但这个反射方法内部会类型判断，看是不是person对象，不是就报错
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入类名:");
        String className = scanner.nextLine();
        System.out.println("请输入方法名:");
        String methodName = scanner.nextLine();

        Class cls1 = Class.forName(className);
        Object obj1 = cls1.newInstance();
        Method method1 = cls1.getMethod(methodName);
        method1.invoke(obj1);
    }
}





